{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "cell_id": "2044f0e17d3d4fb2bd9e49fb527e2f08",
    "deepnote_cell_type": "code",
    "deepnote_to_be_reexecuted": false,
    "execution_millis": 718,
    "execution_start": 1672391369517,
    "source_hash": "e850f112",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "数据集大小： 1000\n",
      "[[ 1.7641  0.4002  0.    ]\n",
      " [ 0.9787  2.2409  0.    ]\n",
      " [ 1.8676 -0.9773  1.    ]\n",
      " [ 0.9501 -0.1514  1.    ]\n",
      " [-0.1032  0.4106  1.    ]]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# 导入数据集\n",
    "data = np.loadtxt('xor_dataset.csv', delimiter=',')\n",
    "print('数据集大小：', len(data))\n",
    "print(data[:5])\n",
    "\n",
    "# 划分训练集与测试集\n",
    "ratio = 0.8\n",
    "split = int(ratio * len(data))\n",
    "np.random.seed(0)\n",
    "data = np.random.permutation(data)\n",
    "# y的维度调整为(len(data), 1)，与后续模型匹配\n",
    "x_train, y_train = data[:split, :2], data[:split, -1].reshape(-1, 1)\n",
    "x_test, y_test = data[split:, :2], data[split:, -1].reshape(-1, 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "cell_id": "df47c976d4dc400a84ee56a1a14476cf",
    "deepnote_cell_type": "code",
    "deepnote_to_be_reexecuted": false,
    "execution_millis": 3,
    "execution_start": 1672391370237,
    "id": "2092E5DBA67946CF87211FF82357EAAB",
    "jupyter": {},
    "notebookId": "6050353b5316950016ec1560",
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "source_hash": "6d7e226e",
    "tags": []
   },
   "outputs": [],
   "source": [
    "# 基类\n",
    "class Layer:\n",
    "    \n",
    "    # 前向传播函数，根据输入x计算该层的输出y\n",
    "    def forward(self, x):\n",
    "        raise NotImplementedError\n",
    "    \n",
    "    # 反向传播函数，输入上一层回传的梯度grad，输出当前层的梯度\n",
    "    def backward(self, grad):\n",
    "        raise NotImplementedError\n",
    "    \n",
    "    # 更新函数，用于更新当前层的参数\n",
    "    def update(self, learning_rate):\n",
    "        pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "cell_id": "b9ba442183c34ee28692f4457c87121a",
    "deepnote_cell_type": "code",
    "deepnote_to_be_reexecuted": false,
    "execution_millis": 2,
    "execution_start": 1672391370246,
    "id": "CEF6ADC4DF9C4D1B85E50F3B33957444",
    "jupyter": {},
    "notebookId": "6050353b5316950016ec1560",
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "source_hash": "fa9c1318",
    "tags": []
   },
   "outputs": [],
   "source": [
    "class Linear(Layer):    \n",
    "\n",
    "    def __init__(self, num_in, num_out, use_bias=True):\n",
    "        self.num_in = num_in # 输入维度\n",
    "        self.num_out = num_out # 输出维度\n",
    "        self.use_bias = use_bias # 是否添加偏置\n",
    "\n",
    "        # 参数的初始化非常重要\n",
    "        # 如果把参数默认设置为0，会导致Wx=0，后续计算失去意义\n",
    "        # 我们直接用正态分布来初始化参数\n",
    "        self.W = np.random.normal(loc=0, scale=1.0, size=(num_in, num_out))\n",
    "        if use_bias: # 初始化偏置\n",
    "            self.b = np.zeros((1, num_out))\n",
    "        \n",
    "    def forward(self, x):\n",
    "        # 前向传播y = Wx + b\n",
    "        # x的维度为(batch_size, num_in)\n",
    "        self.x = x\n",
    "        self.y = x @ self.W # y的维度为(batch_size, num_out)\n",
    "        if self.use_bias:\n",
    "            self.y += self.b\n",
    "        return self.y\n",
    "    \n",
    "    def backward(self, grad):\n",
    "        # 反向传播，按照链式法则计算\n",
    "        # grad的维度为(batch_size, num_out)\n",
    "        # 梯度要对batch_size取平均\n",
    "        # grad_W的维度与W相同，为(num_in, num_out)\n",
    "        self.grad_W = self.x.T @ grad / grad.shape[0]\n",
    "        if self.use_bias:\n",
    "            # grad_b的维度与b相同，为(1, num_out)\n",
    "            self.grad_b = np.mean(grad, axis=0, keepdims=True)\n",
    "        # 向前传播的grad维度为(batch_size, num_in)\n",
    "        grad = grad @ self.W.T\n",
    "        return grad\n",
    "    \n",
    "    def update(self, learning_rate):\n",
    "        # 更新参数以完成梯度下降\n",
    "        self.W -= learning_rate * self.grad_W\n",
    "        if self.use_bias:\n",
    "            self.b -= learning_rate * self.grad_b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "cell_id": "4ef809abf5b541af8f8b88f19addd90c",
    "deepnote_cell_type": "code",
    "deepnote_to_be_reexecuted": false,
    "execution_millis": 1,
    "execution_start": 1672391370282,
    "id": "D7898DAD73B744FFA0A193645E427AB1",
    "jupyter": {},
    "notebookId": "6050353b5316950016ec1560",
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "source_hash": "569d950",
    "tags": []
   },
   "outputs": [],
   "source": [
    "class Identity(Layer):\n",
    "    # 单位函数\n",
    "\n",
    "    def forward(self, x):\n",
    "        return x\n",
    "\n",
    "    def backward(self, grad):\n",
    "        return grad\n",
    "\n",
    "\n",
    "class Sigmoid(Layer):  \n",
    "    # 逻辑斯谛函数\n",
    "\n",
    "    def forward(self, x):\n",
    "        self.x = x\n",
    "        self.y = 1 / (1 + np.exp(-x))\n",
    "        return self.y\n",
    "    \n",
    "    def backward(self, grad):\n",
    "        return grad * self.y * (1 - self.y)\n",
    "\n",
    "\n",
    "class Tanh(Layer):\n",
    "    # tanh函数\n",
    "\n",
    "    def forward(self, x):\n",
    "        self.x = x\n",
    "        self.y = np.tanh(x)\n",
    "        return self.y\n",
    "\n",
    "    def backward(self, grad):\n",
    "        return grad * (1 - self.y ** 2)\n",
    "\n",
    "\n",
    "class ReLU(Layer):\n",
    "    # ReLU函数\n",
    "\n",
    "    def forward(self, x):\n",
    "        self.x = x\n",
    "        self.y = np.maximum(x, 0)\n",
    "        return self.y\n",
    "\n",
    "    def backward(self, grad):\n",
    "        return grad * (self.x >= 0)\n",
    "\n",
    "\n",
    "    \n",
    "# 存储所有激活函数和对应名称，方便索引\n",
    "activation_dict = { \n",
    "    'identity': Identity,\n",
    "    'sigmoid': Sigmoid,\n",
    "    'tanh': Tanh,\n",
    "    'relu': ReLU\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "cell_id": "b58160878c2942a9b8919908d466d94e",
    "deepnote_cell_type": "code",
    "deepnote_to_be_reexecuted": false,
    "execution_millis": 0,
    "execution_start": 1672391370283,
    "id": "C466619E2A1347B99171BCE4E4376141",
    "jupyter": {},
    "notebookId": "6050353b5316950016ec1560",
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "source_hash": "7a8867a1",
    "tags": []
   },
   "outputs": [],
   "source": [
    "class MLP:\n",
    "\n",
    "    def __init__(\n",
    "        self, \n",
    "        layer_sizes, # 包含每层大小的list\n",
    "        use_bias=True, \n",
    "        activation='relu',\n",
    "        out_activation='identity'\n",
    "    ):\n",
    "        self.layers = []\n",
    "        num_in = layer_sizes[0]\n",
    "        for num_out in layer_sizes[1: -1]:\n",
    "            # 添加全连接层\n",
    "            self.layers.append(Linear(num_in, num_out, use_bias)) \n",
    "            # 添加激活函数\n",
    "            self.layers.append(activation_dict[activation]()) \n",
    "            num_in = num_out\n",
    "        # 由于输出需要满足任务的一些要求\n",
    "        # 例如二分类任务需要输出[0,1]之间的概率值\n",
    "        # 因此最后一层通常做特殊处理\n",
    "        self.layers.append(Linear(num_in, layer_sizes[-1], use_bias))\n",
    "        self.layers.append(activation_dict[out_activation]())\n",
    "        \n",
    "    def forward(self, x):\n",
    "        # 前向传播，将输入依次通过每一层\n",
    "        for layer in self.layers:\n",
    "            x = layer.forward(x)\n",
    "        return x\n",
    "    \n",
    "    def backward(self, grad):\n",
    "        # 反向传播，grad为损失函数对输出的梯度\n",
    "        # 将该梯度依次回传，得到每一层参数的梯度\n",
    "        for layer in reversed(self.layers):\n",
    "            grad = layer.backward(grad)\n",
    "            \n",
    "    def update(self, learning_rate):\n",
    "        # 更新每一层的参数\n",
    "        for layer in self.layers:\n",
    "            layer.update(learning_rate)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "cell_id": "8a062d01af634a67906df76c219c1cb4",
    "deepnote_cell_type": "code",
    "deepnote_to_be_reexecuted": false,
    "execution_millis": 2039,
    "execution_start": 1672391370284,
    "id": "45011B03F73E42F289E873B5BED8F362",
    "jupyter": {},
    "notebookId": "6050353b5316950016ec1560",
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "source_hash": "e5a5aba3",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "测试精度： 0.97\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABR8AAAIhCAYAAADHFs2PAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAACdh0lEQVR4nOzdeVwV9f7H8fdhXwRUBBRFxB13hXIpU3PLLTUrW66maWVaZla3zBb1WrZrWdrmkmXmr1yuda3EXNPc19JMU8EFVFxAUVnn98d0QMQF8MCwvJ6PxzzmzPfMzPkceNzb+Oa72AzDMAQAAAAAAAAADuZkdQEAAAAAAAAASibCRwAAAAAAAAAFgvARAAAAAAAAQIEgfAQAAAAAAABQIAgfAQAAAAAAABQIwkcAAAAAAAAABYLwEQAAAAAAAECBIHwEAAAAAAAAUCAIHwEAAAAAAAAUCMJHALmyY8cODRw4UGFhYfLw8FCZMmXUrFkzvfXWWzp16pTV5eXamDFjZLPZrrodPHgwz/dcvHixxowZ4/BaC5P95xIfH291KQAAAAXuWs+Dl24rVqy44c86f/68xowZk6977dy5UzabTa6uroqNjb3hWgDACi5WFwCg6Pvss880dOhQ1alTR88995zq1aun1NRUbdq0SR9//LF+++03LViwwOoy8+Snn36Sn59fjvZKlSrl+V6LFy/WRx99VOwDSAAAgNLit99+y3b8n//8R8uXL9eyZcuytderV++GP+v8+fMaO3asJKlt27Z5uvbzzz+XJKWlpWnWrFl6/vnnb7geAChshI8Arum3337T448/ro4dO2rhwoVyd3fPfK9jx4565pln9NNPP13zHhcuXJCnp2dBl5onERERqlChQqF/rmEYunjxYpH7eQAAAJQmLVq0yHYcEBAgJyenHO1WSk5O1uzZs9W4cWPFx8dr+vTpRTZ8vHDhgjw8PGSz2awuBUARxLBrANf0+uuvy2az6dNPP80WPNq5ubnpzjvvzDyuVq2aunfvrvnz56tp06by8PDI/Evv77//rp49e6pcuXLy8PBQkyZN9MUXX2S7X0ZGhsaPH686derI09NTZcuWVaNGjfT+++9nnnPixAk9+uijCgkJkbu7uwICAnTLLbdo6dKlDvveBw8elM1m0zvvvKP33ntPYWFhKlOmjFq2bKl169ZlnjdgwAB99NFHknTF4ds2m01PPPGEPv74Y4WHh8vd3T3zO//6669q3769fHx85OXlpVatWul///tftjpmzpwpm82mqKgoDRw4UOXLl5e3t7d69Oih/fv3Z573n//8Ry4uLjp06FCO7/Lwww/L399fFy9evOGfy6JFi9SyZUt5eXnJx8dHHTt2zNFzIDe/n61bt6p79+4KDAyUu7u7goOD1a1bNx0+fPiGawQAAHCElJQUjR8/XnXr1s18phk4cKBOnDiR7bxly5apbdu28vf3l6enp6pWrao+ffro/PnzOnjwoAICAiRJY8eOzXxWHDBgwHU/f+HChTp58qQGDx6shx56SH/99Zd+/fXXHOclJydr3LhxCg8Pl4eHh/z9/dWuXTutXbs285yMjAxNnjxZTZo0yXzGbtGihRYtWpR5js1mu+JInmrVqmWr1/58umTJEj388MMKCAiQl5eXkpOTtW/fPg0cOFC1atWSl5eXKleurB49emjnzp057nvmzBk988wzql69utzd3RUYGKiuXbvqzz//lGEYqlWrljp37pzjunPnzsnPz0/Dhg277s8QQNFAz0cAV5Wenq5ly5YpIiJCISEhub5uy5Yt2r17t1566SWFhYXJ29tbe/bsUatWrRQYGKgPPvhA/v7++uqrrzRgwAAdO3ZM//73vyVJb731lsaMGaOXXnpJt912m1JTU/Xnn3/qzJkzmffv16+ftmzZotdee021a9fWmTNntGXLFp08eTJP3y0tLS1bm81mk7Ozc7a2jz76SHXr1tWkSZMkSS+//LK6du2qAwcOyM/PTy+//LKSkpL03XffZQvhLh2+vXDhQq1evVqvvPKKKlasqMDAQK1cuVIdO3ZUo0aNNG3aNLm7u2vKlCnq0aOH5syZo759+2arY9CgQerYsaO+/vprHTp0SC+99JLatm2rHTt2qGzZsnrsscf02muv6ZNPPtH48eMzrzt16pS++eYbPfHEE/Lw8Mj1z+dKvv76az344IPq1KmT5syZo+TkZL311ltq27atfvnlF916662Srv/7SUpKUseOHRUWFqaPPvpIQUFBiouL0/Lly3X27NkbqhEAAMARMjIy1LNnT61evVr//ve/1apVK0VHR+vVV19V27ZttWnTJnl6eurgwYPq1q2bWrdurenTp6ts2bI6cuSIfvrpJ6WkpKhSpUr66aefdMcdd2jQoEEa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GLTPZ+jj46PQ0FD997//Vfv27VW+fHlVqFDhinNynzx5Uv/973/VuXPnqw4tnjhxombNmqUJEybo/vvv14wZMzRkyBDt2bNH7dq1U0ZGhtavX6/w8HDdd999at26tfr166fx48fr2LFj6t69u9zd3bV161Z5eXnpySeflCT169dPL7/8sl555RW1adNGu3bt0ocffnjFZ+ar6d69u2bOnKm6deuqUaNG2rx5s95+++0cI6hGjBihuXPnqmfPnnrhhRd0880368KFC1q5cqW6d++udu3aZZ7bsWNH1atXT8uXL9e//vUvBQYG5roeAEWElavdACg+tm3bZjz00ENG1apVDTc3N8Pb29to2rSp8corrxjHjx/PPC80NNTo1q3bFe+xc+dOo0ePHoafn5/h5uZmNG7c2JgxY0a2c959912jVatWRoUKFQw3NzejatWqxqBBg4yDBw8ahmEYFy9eNIYMGWI0atTI8PX1NTw9PY06deoYr776qpGUlHTd73Gt1a51yYp79tWu33777Rz30GUrASYnJxuDBw82AgICDJvNZkjKXF1akjFs2LAr1rJ69Wrj9ttvN7y9vQ1PT0+jRYsWxvfff5/tHPtqgkuWLDH69etnlC1b1vD09DS6du1q7N2794r3PXjwoCHJGDJkyHV/Hrn9udgtXLjQaN68ueHh4WF4e3sb7du3N9asWZP5fm5+P3/++adx//33GzVq1DA8PT0NPz8/4+abbzZmzpyZ63oBAAAc6fLVrg3DMFJTU4133nnHaNy4seHh4WGUKVPGqFu3rvHYY49lPof99ttvRu/evY3Q0FDD3d3d8Pf3N9q0aWMsWrQo272WLl1qNG3a1HB3dzckZVs9+lKTJk0yJBkLFy68aq0ff/xxtpW4L1y4YLzyyitGrVq1DDc3N8Pf39+4/fbbjbVr12Zek56ebkycONFo0KCB4ebmZvj5+RktW7bM9uyZnJxs/Pvf/zZCQkIMT09Po02bNsa2bduuutr1xo0bc9R2+vRpY9CgQUZgYKDh5eVl3Hrrrcbq1auNNm3aGG3atMlx7lNPPWVUrVrVcHV1NQIDA41u3boZf/75Z477jhkzxpBkrFu37qo/FwBFl80wLhk/BwAoUmbOnKmBAwdq48aNuR4+PnnyZA0fPly///676tevX8AVAgAAAAUrMjJSNputSM3rDiD3GHYN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GKEpU6bolltu0SeffKIuXbpo165dqlq1ao7z33//fb3xxhuZx2lpaWrcuLHuueeewiw7V9zczD3hIwAAxUPbtm3VpEkTTZo0yepSAAA7d0rR0VZXgdLot9/MPXM1Ag5jafj43nvvadCgQRo8eLAkadKkSfr55581depUTZgwIcf5fn5+8vPzyzxeuHChTp8+rYEDBxZazblFz0cAAPKuIALAAQMG6MyZM1q4cKHD7gkAKEB79pi9zgArXaFDFID8sSx8TElJ0ebNm/XCCy9ka+/UqZPWrl2bq3tMmzZNHTp0UGho6FXPSU5OVnJycuZxYmJi/grOI8JHAAAAAMiH7dvNva+vVKeOtbWgdAoMlHr1sroKoMSwLHyMj49Xenq6goKCsrUHBQUpLi7uutfHxsbqxx9/1Ndff33N8yZMmKCxY8feUK35QfgIACiSkpKu/p6zs+ThkbtznZwkT8/rn+vtnevSBgwYoJUrV2rlypV6//33JUkHDhxQtWrVtGvXLj377LNatWqVvL291alTJ02cOFEVKlSQJH333XcaO3as9u3bJy8vLzVt2lT//e9/9fbbb2fOF22z2SRJy5cvV9u2ba9bz+nTp/XUU0/p+++/V3Jystq0aaMPPvhAtWrVkiRFR0friSee0K+//qqUlBRVq1ZNb7/9trp27arTp0/riSee0JIlS3Tu3DlVqVJFL774YpEcrQEARY59zr1u3aTr/HsPAFD0OVldgP0fAnaGYeRou5KZM2eqbNmy6nWdv0aMGjVKCQkJmdsh+3/IChjhIwCgSCpT5upbnz7Zzw0MvPq5l0/AXq3alc/Lg/fff18tW7bUI488otjYWMXGxiokJESxsbFq06aNmjRpok2bNumnn37SsWPHdO+990oy/yB5//336+GHH9bu3bu1YsUK3XXXXTIMQ88++6zuvfde3XHHHZn3bNWqVa7qGTBggDZt2qRFixbpt99+k2EY6tq1q1L/+Y/7sGHDlJycrFWrVmnnzp168803Veaf7/zyyy9r165d+vHHH7V7925NnTo1MygFAFyHfbVh5twDgBLBsp6PFSpUkLOzc45ejsePH8/RG/JyhmFo+vTp6tevn9zsK7tchbu7u9zd3W+43rwifAQAIG/8/Pzk5uYmLy8vVaxYMbN96tSpatasmV5//fXMtunTpyskJER//fWXzp07p7S0NN11112ZU7E0bNgw81xPT08lJydnu+f17N27V4sWLdKaNWsyw8rZs2crJCRECxcu1D333KOYmBj16dMn87OqV6+eeX1MTIyaNm2qyMhISVK1atXy/gMBgNLo//5P+uAD8zXhIwCUCJaFj25uboqIiFBUVJR69+6d2R4VFaWePXte89qVK1dq3759GjRoUEGXmW+EjwCAIuncuau/5+yc/fj48auf63TZ4ImDB/Nd0vVs3rxZy5cvz+xVeKm///5bnTp1Uvv27dWwYUN17txZnTp10t13361y5crl+zN3794tFxcXNW/ePLPN399fderU0e7duyVJw4cP1+OPP64lS5aoQ4cO6tOnjxr9s0DC448/rj59+mjLli3q1KmTevXqleselwBQqr32WtbrZs2sqwMA4DCWDrseOXKkPv/8c02fPl27d+/W008/rZiYGA0ZMkSSOWS6f//+Oa6bNm2amjdvrgYNGhR2yblG+AgAKJK8va++XTrf4/XOvXS+x2ud6wAZGRnq0aOHtm3blm3bu3evbrvtNjk7OysqKko//vij6tWrp8mTJ6tOnTo6cOBAvj/TMIyrttunhxk8eLD279+vfv36aefOnYqMjNTkyZMlSV26dFF0dLRGjBiho0ePqn379nr22WfzXQ8AlBr2IddffinxRxsAKBEsDR/79u2rSZMmady4cWrSpIlWrVqlxYsXZw6Zio2NVYz9Pz7/SEhI0Lx584p0r0dlZGjIivu0SD1kS0ywuhoAAIoNNzc3paenZ2tr1qyZ/vjjD1WrVk01a9bMtnn/E3DabDbdcsstGjt2rLZu3So3NzctWLDgqve8nnr16iktLU3r16/PbDt58qT++usvhYeHZ7aFhIRoyJAhmj9/vp555hl99tlnme8FBARowIAB+uqrrzRp0iR9+umnef55AECpcu6cdOaM+frOOy0tBQDgOJYNu7YbOnSohg4desX3Zs6cmaPNz89P58+fL+CqbpCTk5ocmK9IpWp3UqIkP6srAgCgWKhWrZrWr1+vgwcPqkyZMipfvryGDRumzz77TPfff7+ee+45VahQQfv27dM333yjzz77TJs2bdIvv/yiTp06KTAwUOvXr9eJEycyQ8Jq1arp559/1p49e+Tv7y8/Pz+52ocoXEWtWrXUs2dPPfLII/rkk0/k4+OjF154QZUrV86cHmbEiBHq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Q7fccosMw9CaNWs0ZswYXbx4Ua+99lqu7jNy5Ej169dPkZGRatmypT799FPFxMRoyJAhkswh00eOHNGsWbPk5OSkBg0aZLs+MDBQHh4eOdpLMrfa1aQoyedMjJSeLjk7W10SAABAobrSH6rvvvtu1a9fX3PnztWgQYMsqKoEInwEAAAOkK/w8YsvvtDnn3+uO++8M7OtcePGqly5soYOHZrr8LFv3746efKkxo0bp9jYWDVo0ECLFy9WaGioJCk2NlYxMTH5KbHEKl+/krposcJuq6YpPAgCAABkat68uR555BGryyg5CB8BAIAD5Ct8PHXqlOrWrZujvW7dujp16lSe7jV06FANHTr0iu/NnDnzmteOGTNGY8aMydPnFXch1Zz1k7qo0Snlc7kgAACAkufChQuaPHmyqlSpYnUpJQ/hIwAAuAH5Ch8bN26sDz/8UB988EG29g8//FCNGjVySGG4sn86hYoOoQAAoLQqV65ctgVnDMPQ2bNn5eXlpa+++srCykoYe89HAACAG5Cv8PGtt95St27dtHTpUrVs2VI2m01r167VoUOHtHjxYkfXiEtUrSq10G+6/cwynf+2ibzu6WZ1SQAAAIVq4sSJ2cJHJycnBQQEqHnz5ipXrpyFlZUwDLsGAAAOkK/wsU2bNvrrr7/00Ucf6c8//5RhGLrrrrv06KOPasyYMWrdurWj68Q/ypSRenku0fMXxujUnEGEjwAAoNQZMGCA1SWUDoSPAADAAfIVPkpScHBwjoVltm/fri+++ELTp0+/4cJwdecrVpcOSOl791tdCgAAQKGbMWOGypQpo3vuuSdb+7fffqvz58/roYcesqiyEobwEQAAOABLlhRDRo2akiT3Q3strgQAAKDwvfHGG6pQoUKO9sDAQL3++usWVFRCET4CAAAHIHwshjwa1pIk+SYcli5csLgaAACAwhUdHa2wsLAc7aGhoYphVT7HIXwEAAAOQPhYDAU39NdplTUP/v7b0loAAAAKW2BgoHbs2JGjffv27fL397egohKK8BEAADhAnuZ8vOuuu675/pkzZ26kFuRSjZo27VNN3aRN0r59UoMGVpcEAABQaO677z4NHz5cPj4+uu222yRJK1eu1FNPPaX77rvP4upKEMJHAADgAHkKH/38/K77fv/+/W+oIFxfjRrSCtXSTdqk9D/3ytnqggAAAArR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YI2aNaVffpECAqR5u+upo896pUa0kM6ckTp1MleoAQAAKET5eSatVKmSKleuLD8/v8y28PBwGYahw4cPX/Eay55JCR8BAIDFLAsf3dzcFBERoaioqGztUVFRatWq1VWvmzNnjgYMGKCvv/5a3bp1K+gy4WDh4WYPyKAgafkfgbrp7DKdv7Ov+WA8eLD06KPSxYtWlwkAAEqJ/DyT3nLLLTp69KjOnTuX2fbXX3/JyclJVapUKdB684zwEQAAWMzSYdcjR47U559/runTp2v37t16+umnFRMToyFDhkgyh6f0798/8/w5c+aof//+evfdd9WiRQvFxcUpLi5OCQkJVn0F5EODBtKqVeYckNv/8lTDHV/r1Ihxks0mbd9u7gEAAApJXp9JH3jgAfn7+2vgwIHatWuXVq1apeeee04PP/ywPD09rfoaV5aaau4JHwEAgEUsfQrp27evTp48qXHjxik2NlYNGjTQ4sWLFRoaKkmKjY1VTExM5vmffPKJ0tLSNGzYsGwTej/00EOaOXNmYZePG1C7trR6tdS+vfT3304K//plrfqghercWUdydzdPMgyCSAAAUODy+kxapkwZRUVF6cknn1RkZKT8/f117733avz48VZ9hauj5yMAALCYzTAMw+oiClNiYqL8/PyUkJDA/I9FQFyc1LWrtHWr5OUl/d//SZmj6Z97TkpJkd54QypqvQgAALAQzzPFX6H9Dtu3N+e8mTNHuu++gvscAABQquTlWcby1a5RulWsKK1cKXXuLJ0/L915p/TJJ5L27pXefVf64APpppukHTusLhUAAKD4oecjAACwGOEjLOfjI33/vTRwoJSRIQ0ZIg2fXEtp//2fuTLNH3+YAeR770np6VaXCwAAUHwQPgIAAIsRPqJIcHWVpk2T/vMf83jyZKnzpC46tWKH1KOHOfz6mWek226T/vzT2mIBAACKC8JHAABgMcJHFBk2m/TSS9LChVKZMub0RJFdA7Vz/H/Nsdg+PtLatVK7dlJystXlAgAAFH2EjwAAwGKEjyhyevaUfvtNql5dOnBAatHSpi89HzWHX3fpIr3+etaK2AAAALi61FRzT/gIAAAsQviIIqlBA2nDBqlDB3Mhmv79pcFjQ3T+2/9JAwZknbhggTkcOzHRsloBAACKLHo+AgAAixE+osjy95d++kkaO9Yckj1tmtS8hU1/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",
      "text/plain": [
       "<Figure size 1600x600 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 设置超参数\n",
    "num_epochs = 1000\n",
    "learning_rate = 0.1\n",
    "batch_size = 128\n",
    "eps=1e-7 # 用于防止除以0、log(0)等数学问题\n",
    "\n",
    "# 创建一个层大小依次为[2, 4, 1]的多层感知机\n",
    "# 对于二分类任务，我们用sigmoid作为输出层的激活函数，使其输出在[0,1]之间\n",
    "mlp = MLP(layer_sizes=[2, 4, 1], use_bias=True, out_activation='sigmoid')\n",
    "\n",
    "# 训练过程\n",
    "losses = []\n",
    "test_losses = []\n",
    "test_accs = []\n",
    "for epoch in range(num_epochs):\n",
    "    # 我们实现的MLP支持批量输入，因此采用SGD算法\n",
    "    st = 0\n",
    "    loss = 0.0\n",
    "    while True:\n",
    "        ed = min(st + batch_size, len(x_train))\n",
    "        if st >= ed:\n",
    "            break\n",
    "        # 取出batch\n",
    "        x = x_train[st: ed]\n",
    "        y = y_train[st: ed]\n",
    "        # 计算MLP的预测\n",
    "        y_pred = mlp.forward(x)\n",
    "        # 计算梯度∂J/∂y\n",
    "        grad = (y_pred - y) / (y_pred * (1 - y_pred) + eps)\n",
    "        # 反向传播\n",
    "        mlp.backward(grad)\n",
    "        # 更新参数\n",
    "        mlp.update(learning_rate)\n",
    "        # 计算交叉熵损失\n",
    "        train_loss = np.sum(-y * np.log(y_pred + eps) \\\n",
    "            - (1 - y) * np.log(1 - y_pred + eps))\n",
    "        loss += train_loss\n",
    "        st += batch_size\n",
    "\n",
    "    losses.append(loss / len(x_train))\n",
    "    # 计算测试集上的交叉熵和精度\n",
    "    y_pred = mlp.forward(x_test)\n",
    "    test_loss = np.sum(-y_test * np.log(y_pred + eps) \\\n",
    "        - (1 - y_test) * np.log(1 - y_pred + eps)) / len(x_test)\n",
    "    test_acc = np.sum(np.round(y_pred) == y_test) / len(x_test)\n",
    "    test_losses.append(test_loss)\n",
    "    test_accs.append(test_acc)\n",
    "    \n",
    "print('测试精度：', test_accs[-1])\n",
    "# 将损失变化进行可视化\n",
    "plt.figure(figsize=(16, 6))\n",
    "plt.subplot(121)\n",
    "plt.plot(losses, color='blue', label='train loss')\n",
    "plt.plot(test_losses, color='red', ls='--', label='test loss')\n",
    "plt.xlabel('Step')\n",
    "plt.ylabel('Loss')\n",
    "plt.title('Cross-Entropy Loss')\n",
    "plt.legend()\n",
    "\n",
    "plt.subplot(122)\n",
    "plt.plot(test_accs, color='red')\n",
    "plt.ylim(top=1.0)\n",
    "plt.xlabel('Step')\n",
    "plt.ylabel('Accuracy')\n",
    "plt.title('Test Accuracy')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "cell_id": "a11de343daf24ac1b87410184bce8ccb",
    "deepnote_cell_type": "code",
    "deepnote_to_be_reexecuted": false,
    "execution_millis": 3017,
    "execution_start": 1672391372327,
    "id": "0C1A50320D34469BA86DFD7BBE27E87E",
    "jupyter": {},
    "notebookId": "6050353b5316950016ec1560",
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "source_hash": "53ffe62a",
    "tags": []
   },
   "outputs": [],
   "source": [
    "import torch # PyTorch库\n",
    "import torch.nn as nn # PyTorch中与神经网络相关的工具\n",
    "from torch.nn.init import normal_ # 正态分布初始化\n",
    "\n",
    "torch_activation_dict = {\n",
    "    'identity': lambda x: x,\n",
    "    'sigmoid': torch.sigmoid,\n",
    "    'tanh': torch.tanh,\n",
    "    'relu': torch.relu\n",
    "}\n",
    "\n",
    "# 定义MLP类，基于PyTorch的自定义模块通常都继承nn.Module\n",
    "# 继承后，只需要实现forward函数，进行前向传播\n",
    "# 反向传播与梯度计算均由PyTorch自动完成\n",
    "class MLP_torch(nn.Module):\n",
    "\n",
    "    def __init__(\n",
    "        self, \n",
    "        layer_sizes, # 包含每层大小的list\n",
    "        use_bias=True, \n",
    "        activation='relu',\n",
    "        out_activation='identity'\n",
    "    ):\n",
    "        super().__init__() # 初始化父类\n",
    "        self.activation = torch_activation_dict[activation]\n",
    "        self.out_activation = torch_activation_dict[out_activation]\n",
    "        self.layers = nn.ModuleList() # ModuleList以列表方式存储PyTorch模块\n",
    "        num_in = layer_sizes[0]\n",
    "        for num_out in layer_sizes[1:]:\n",
    "            # 创建全连接层\n",
    "            self.layers.append(nn.Linear(num_in, num_out, bias=use_bias))\n",
    "            # 正态分布初始化，采用与前面手动实现时相同的方式\n",
    "            normal_(self.layers[-1].weight, std=1.0)\n",
    "            # 偏置项为全0\n",
    "            self.layers[-1].bias.data.fill_(0.0)\n",
    "            num_in = num_out\n",
    "\n",
    "    def forward(self, x):\n",
    "        # 前向传播\n",
    "        # PyTorch可以自行处理batch_size等维度问题\n",
    "        # 我们只需要让输入依次通过每一层即可\n",
    "        for i in range(len(self.layers) - 1):\n",
    "            x = self.layers[i](x)\n",
    "            x = self.activation(x)\n",
    "        # 输出层\n",
    "        x = self.layers[-1](x)\n",
    "        x = self.out_activation(x)\n",
    "        return x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "cell_id": "02d475246cf044cc88abc01c2eaeae4a",
    "deepnote_cell_type": "code",
    "deepnote_to_be_reexecuted": false,
    "execution_millis": 10685,
    "execution_start": 1672391375357,
    "source_hash": "88df290a",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "测试精度： 0.965\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABR8AAAIhCAYAAADHFs2PAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAACcaklEQVR4nOzdd3RUVdvG4XvSCyRASEILCb0FEBOpIj0YEAERsLwgCCoCStNXEQvwoSg2FAELTay8FhAVkSBIEQtVwCCglFASOgk19Xx/HCYQQgmQmZNJftdaZ03m5JyZZ5K1dHPn2XvbDMMwBAAAAAAAAAD5zM3qAgAAAAAAAAAUToSPAAAAAAAAAByC8BEAAAAAAACAQxA+AgAAAAAAAHAIwkcAAAAAAAAADkH4CAAAAAAAAMAhCB8BAAAAAAAAOAThIwAAAAAAAACHIHwEAAAAAAAA4BCEjwDyZOPGjerbt68qVaokHx8fFStWTDfffLMmTJigo0ePWl1eno0ePVo2m+2yx65du675NRcsWKDRo0fne63OZP+5HD582OpSAAAAHO5K48ELj59//vmG3+v06dMaPXr0db3Wpk2bZLPZ5OnpqcTExBuuBQCs4GF1AQAKvg8++EADBw5UjRo19OSTT6p27dpKT0/XmjVr9O677+rXX3/V3LlzrS7zmixcuFCBgYG5zpctW/aaX2vBggWaPHmyyweQAAAARcWvv/6a4/n//d//aenSpVqyZEmO87Vr177h9zp9+rTGjBkjSWrZsuU13Ttt2jRJUkZGhmbPnq2nnnrqhusBAGcjfARwRb/++qseffRRtWvXTvPmzZO3t3f299q1a6cRI0Zo4cKFV3yNM2fOyNfX19GlXpOoqCiVLl3a6e9rGIbOnj1b4H4eAAAARUnjxo1zPA8ODpabm1uu81ZKTU3VJ598ovr16+vw4cOaMWNGgQ0fz5w5Ix8fH9lsNqtLAVAAMe0awBW99NJLstlsev/993MEj3ZeXl668847s59HRETojjvu0Ndff60GDRrIx8cn+y+9mzdvVufOnVWyZEn5+Pjopptu0ocffpjj9bKysjRu3DjVqFFDvr6+KlGihOrVq6e33nor+5pDhw7p4YcfVlhYmLy9vRUcHKxmzZpp8eLF+fa5d+3aJZvNptdee01vvPGGKlWqpGLFiqlJkyb67bffsq/r06ePJk+eLEmXnL5ts9k0ePBgvfvuu6pVq5a8vb2zP/PKlSvVpk0bFS9eXH5+fmratKm+//77HHXMmjVLNptNcXFx6tu3r0qVKiV/f3916tRJO3bsyL7u//7v/+Th4aE9e/bk+iwPPviggoKCdPbs2Rv+ucyfP19NmjSRn5+fihcvrnbt2uXqHMjL72f9+vW64447FBISIm9vb5UrV04dO3bU3r17b7hGAACA/JCWlqZx48apZs2a2WOavn376tChQzmuW7JkiVq2bKmgoCD5+vqqYsWK6tatm06fPq1du3YpODhYkjRmzJjssWKfPn2u+v7z5s3TkSNH1L9/fz3wwAPatm2bVq5cmeu61NRUjR07VrVq1ZKPj4+CgoLUqlUrrVq1KvuarKwsTZo0STfddFP2GLtx48aaP39+9jU2m+2SM3kiIiJy1Gsfny5atEgPPviggoOD5efnp9TUVP3zzz/q27evqlWrJj8/P5UvX16dOnXSpk2bcr3u8ePHNWLECFWuXFne3t4KCQlRhw4d9Pfff8swDFWrVk3t27fPdd/JkycVGBioQYMGXfVnCKBgoPMRwGVlZmZqyZIlioqKUlhYWJ7vW7dunbZs2aJnn31WlSpVkr+/v7Zu3aqmTZsqJCREb7/9toKCgvTxxx+rT58+OnDggP773/9KkiZMmKDRo0fr2Wef1W233ab09HT9/fffOn78ePbr9+rVS+vWrdOLL76o6tWr6/jx41q3bp2OHDlyTZ8tIyMjxzmbzSZ3d/cc5yZPnqyaNWtq4sSJkqTnnntOHTp00M6dOxUYGKjnnntOp06d0pdffpkjhLtw+va8efO0YsUKPf/88ypTpoxCQkK0bNkytWvXTvXq1dP06dPl7e2tKVOmqFOnTvrss8/Us2fPHHX069dP7dq106effqo9e/bo2WefVcuWLbVx40aVKFFCjzzyiF588UW99957GjduXPZ9R48e1eeff67BgwfLx8cnzz+fS/n00091//33KyYmRp999plSU1M1YcIEtWzZUj/99JNuvfVWSVf//Zw6dUrt2rVTpUqVNHnyZIWGhiopKUlLly7ViRMnbqhGAACA/JCVlaXOnTtrxYoV+u9//6umTZtq9+7deuGFF9SyZUutWbNGvr6+2rVrlzp27KjmzZtrxowZKlGihPbt26eFCxcqLS1NZcuW1cKFC3X77berX79+6t+/vyRlB5JXYh8j3n///Tp69KjGjx+v6dOnZ4+5JHM6dmxsrFasWKGhQ4eqdevWysjI0G+//aaEhAQ1bdpUkvkH848//lj9+vXT2LFj5eXlpXXr1l3Xeud2Dz74oDp27KiPPvpIp06dkqenp/bv36+goCC9/PLLCg4O1tGjR/Xhhx+qUaNGWr9+vWrUqCFJOnHihG699Vbt2rVLTz31lBo1aqSTJ09q+fLlSkxMVM2aNfXYY49p6NCh2r59u6pVq5b9vrNnz1ZKSgrhI+BKDAC4jKSkJEOScc899+T5nvDwcMPd3d3YunVrjvP33HOP4e3tbSQkJOQ4Hxsba/j5+RnHjx83DMMw7rjjDuOmm2664nsUK1bMGDp0aJ5rutALL7xgSLrkUaVKlezrdu7caUgy6tata2RkZGSf/+OPPwxJxmeffZZ9btCgQcbl/nMqyQgMDDSOHj2a43zjxo2NkJAQ48SJE9nnMjIyjMjISKNChQpGVlaWYRiGMXPmTEOS0bVr1xz3//LLL4YkY9y4cdnnHnjgASMkJMRITU3NPvfKK68Ybm5uxs6dO/P0czl06NAlv5+ZmWmUK1fOqFu3rpGZmZl9/sSJE0ZISIjRtGnT7HNX+/2sWbPGkGTMmzfvijUBAAA4ywMPPGD4+/tnP//ss88MScZXX32V47rVq1cbkowpU6YYhmEYX375pSHJ2LBhw2Vf+9ChQ4Yk44UXXshzPbt27TLc3NxyjMNbtGhh+Pv7GykpKdnnZs+ebUgyPvjgg8u+1vLlyw1JxqhRo674nperMTw83HjggQeyn9vHp717977q58jIyDDS0tKMatWqGcOGDcs+P3bsWEOSERcXd9l7U1JSjOLFixtDhgzJcb527dpGq1atrvreAAoOpl0DyHf16tVT9erVc5xbsmSJ2rRpk6uDsk+fPjp9+nR212DDhg31559/auDAgfrxxx+VkpKS6/UbNmyoWbNmady4cfrtt9+Unp6e4/uGYSgjIyPHcbHFixdr9erVOY558+bluq5jx445uiHr1asnSdq9e3fefhiSWrdurZIlS2Y/P3XqlH7//XfdfffdKlasWPZ5d3d39erVS3v37tXWrVtzvMb999+f43nTpk0VHh6upUuXZp8bMmSIDh48qC+++EKS+Rf7qVOnqmPHjoqIiMhzvZeydetW7d+/X7169ZKb2/n/dRQrVkzdunXTb7/9ptOnT0u6+u+natWqKlmypJ566im9++67io+Pv6HaAAAA8tt3332nEiVKqFOnTjnGlDfddJPKlCmTvXP1TTfdJC8vLz388MP68MMPcyyLcyNmzpyprKwsPfjgg9nnHnzwQZ06dUpz5szJPvfDDz/Ix8cnx3UX++GHHyQp3zsFu3XrlutcRkaGXnrpJdWuXVteXl7y8PCQl5eXtm/fri1btuSoqXr16mrbtu1lX7948eLq27evZs2apVOnTkky/00RHx+vwYMH5+tnAeBYhI8ALqt06dLy8/PTzp07r+m+S+0YfeTIkUueL1euXPb3JWnkyJF67bXX9Ntvvyk2NlZBQUFq06aN1qxZk33PnDlz9MADD2jatGlq0qSJSpUqpd69eyspKUmS9OGHH8rT0zPHcbH69esrOjo6xxEZGZnruqCgoBzP7etenjlzJq8/jlyf+9ixYzIMI08/D7syZcrkurZMmTI5rmvQoIGaN2+evQbld999p127duXL4Mz+PperOSsrS8eOHZN09d9PYGCgli1bpptuuknPPPOM6tSpo3LlyumFF17IFVQCAABY4cCBAzp+/Li8vLxyjSuTkpJ0+PBhSVKVKlW0ePFihYSEaNCgQapSpYqqVKmSY73ya5WVlaVZs2apXLlyioqK0vHjx3X8+HG1bdtW/v7+mj59eva1hw4dUrly5XL8cfhihw4dkru7+yXHkzfiUuPC4cOH67nnnlOXLl307bff6vfff9fq1atVv379HOPnQ4cOqUKFCld9j8cee0wnTpzQJ598Ikl65513VKFCBXXu3Dn/PggAh2PNRwCX5e7urjZt2uiHH37Q3r178zRAkHTJXe6CgoKUmJiY6/z+/fslKXvnaQ8PDw0fPlzDhw/X8ePHtXjxYj3zzDNq37699uzZIz8/P5UuXVoTJ07UxIkTlZCQoPnz5+vpp5/WwYMHtXDhQnXq1EmrV6++gU+evy7+eZQsWVJubm55+nnY2YO7i89VrVo1x7nHH39c3bt317p16/TOO++oevXqateu3Y1+hOwQ9nI1u7m5ZXd3Xu33I0l169bV559/LsMwtHHjRs2aNUtjx46Vr6+vnn766RuuFwAA4EaULl1aQUFB2WOXixUvXjz76+bNm6t58+bKzMzUmjVrNGnSJA0dOlShoaG65557rvm9Fy9enD3L5uI/hEvSb7/9pvj4eNWuXVvBwcFauXKlsrKyLhtABgcHKzMzU0lJSZcMDO28vb2Vmpqa6/zl1lW/1Jj/448/Vu/evfXSSy/lOH/48GGVKFEiR0152WiwatWqio2N1eTJkxUbG6v58+drzJgxudZpB1Cw0fkI4IpGjhwpwzD00EMPKS0tLdf309PT9e233171ddq0aaMlS5Zkh2t2s2fPlp+fnxo3bpzrnhIlSujuu+/WoEGDdPTo0UsuiF2xYkUNHjxY7dq107p16ySZg7SLuxod6Vq7If39/dWoUSN9/fXXOe7JysrSxx9/rAoVKuSatm7/a6/dqlWrtHv3brVs2TLH+a5du6pixYoaMWKEFi9erIEDB15yYHitatSoofLly+vTTz+VYRjZ50+dOqWvvvoqewfsi13q93Mhm82m+vXr680331SJEiUueQ0AAICz3XHHHTpy5IgyMzNzjSujo6OzN065kLu7uxo1apQ9C8U+rrnWseL06dPl5uamefPmaenSpTmOjz76SJI0Y8YMSVJsbKzOnj2rWbNmXfb1YmNjJUlTp0694vtGRERo48aNOc4tWbJEJ0+ezFPdkjm2s39eu++//1779u3LVdO2bdu0ZMmSq77mkCFDtHHjRj3wwANyd3fXQw89lOd6ABQMdD4CuKImTZpo6tSpGjhwoKKiovToo4+qTp06Sk9P1/r16/X+++8rMjJSnTp1uuLrvPDCC/ruu+/UqlUrPf/88ypVqpQ++eQTff/995owYYICAwMlSZ06dVJkZKSio6MVHBys3bt3a+LEiQoPD1e1atWUnJysVq1a6b777lPNmjVVvHhxrV69WgsXLtRdd92V58+1du3a7Pe8UO3atRUQEHBNP6O6detKkl555RXFxsbK3d1d9erVk5eX12XvGT9+vNq1a6dWrVrpiSeekJeXl6ZMmaLNmzfrs88+yxUYrlmzRv3791f37t21Z88ejRo1SuXLl9fAgQNzXOfu7q5Bgwbpqaeekr+/v/r06XNNn+Xbb7/N8Zd8u7vvvlsTJkzQ/fffrzvuuEOPPPKIUlNT9eqrr+r48eN6+eWXJSlPv5/vvvtOU6ZMUZcuXVS5cmUZhqGvv/5ax48fz5cuTQAAgBt1zz336JNPPlGHDh00ZMgQNWzYUJ6entq7d6+WLl2qzp07q2vXrnr33Xe1ZMkSdezYURUrVtTZs2ezg0H7eobFixdXeHi4vvnmG7Vp00alSpVS6dKlL7km95EjR/TNN9+offv2l51a/Oabb2r27NkaP3687r33Xs2cOVMDBgzQ1q1b1apVK2VlZen3339XrVq1dM8996h58+bq1auXxo0bpwMHDuiOO+6Qt7e31q9fLz8/Pz322GOSpF69eum5557T888/rxYtWig+Pl7vvPPOJcfMl3PHHXdo1qxZqlmzpurVq6e1a9fq1VdfzTWDaujQoZozZ446d+6sp59+Wg0bNtSZM2e0bNky3XHHHWrVqlX2te3atVPt2rW1dOlS/ec//1FISEie6wFQQFi52w0A17FhwwbjgQceMCpWrGh4eXkZ/v7+RoMGDYznn3/eOHjwYPZ14eHhRseOHS/5Gps2bTI6depkBAYGGl5eXkb9+vWNmTNn5rjm9ddfN5o2bWqULl3a8PLyMipWrGj069fP2LVrl2EYhnH27FljwIABRr169YyAgADD19fXqFGjhvHCCy8Yp06duurnuNJu17pgxz37btevvvpqrtfQRTsBpqamGv379zeCg4MNm81mSMreXVqSMWjQoEvWsmLFCqN169aGv7+/4evrazRu3Nj49ttvc1xj301w0aJFRq9evYwSJUoYvr6+RocOHYzt27df8nV37dplSDIGDBhw1Z9HXn8udvPmzTMaNWpk+Pj4GP7+/kabNm2MX375Jfv7efn9/P3338a9995rVKlSxfD19TUCAwONhg0bGrNmzcpzvQAAAPnp4t2uDcMw0tPTjddee82oX7++4ePjYxQrVsyoWbOm8cgjj2SPw3799Veja9euRnh4uOHt7W0EBQUZLVq0MObPn5/jtRYvXmw0aNDA8Pb2NiTl2D36QhMnTjQkGfPmzbtsre+++26OnbjPnDljPP/880a1atUMLy8vIygoyGjdurWxatWq7HsyMzONN99804iMjDS8vLyMwMBAo0mTJjnGnqmpqcZ///tfIywszPD19TVatGhhbNiw4bK7Xa9evTpXbceOHTP69etnhISEGH5+fsatt95qrFixwmjRooXRokWLXNcOGTLEqFixouHp6WmEhIQYHTt2NP7+++9crzt69GhDkvHbb79d9ucCoOCyGcYF8+cAAAXKrFmz1LdvX61evTrP08cnTZqkxx9/XJs3b1adOnUcXCEAAADgWNHR0bLZbAVqXXcAece0awAoJNavX6+dO3dq7Nix6ty5M8EjAAAAXFZKSoo2b96s7777TmvXrtXcuXOtLgnAdSJ8BIBComvXrkpKSlLz5s317rvvWl0OAAAAcN3WrVunVq1aKSgoSC+88IK6dOlidUkArhPTrgEAAAAAAAA4hJvVBQAAAABWWb58uTp16qRy5crJZrNp3rx5V71n2bJlioqKko+PjypXrky3OQAAwBUQPgIAAKDIOnXqlOrXr6933nknT9fv3LlTHTp0UPPmzbV+/Xo988wzevzxx/XVV185uFIAAADXxLRrAAAAQJLNZtPcuXOvuK7YU089pfnz52vLli3Z5wYMGKA///xTv/76qxOqBAAAcC1FbsOZrKws7d+/X8WLF5fNZrO6HAAAgGtmGIZOnDihcuXKyc2NiSzO9OuvvyomJibHufbt22v69OlKT0+Xp6fnJe9LTU1Vampq9vOsrCwdPXpUQUFBjEkBAIDLuZbxaJELH/fv36+wsDCrywAAALhhe/bsUYUKFawuo0hJSkpSaGhojnOhoaHKyMjQ4cOHVbZs2UveN378eI0ZM8YZJQIAADhNXsajRS58LF68uCTzhxMQEGBxNQAAANcuJSVFYWFh2eMaONfFnYr2VYyu1ME4cuRIDR8+PPt5cnKyKlasyJgUAAC4pGsZjxa58NE+KAwICGCgBwAAXBrTdZ2vTJkySkpKynHu4MGD8vDwUFBQ0GXv8/b2lre3d67zjEkBAIAry8t4lEWCAAAAgDxq0qSJ4uLicpxbtGiRoqOjL7veIwAAQFFG+AgAAIAi6+TJk9qwYYM2bNggSdq5c6c2bNighIQESeZ06d69e2dfP2DAAO3evVvDhw/Xli1bNGPGDE2fPl1PPPGEFeUDAAAUeEVu2jUAAABgt2bNGrVq1Sr7uX1dxgceeECzZs1SYmJidhApSZUqVdKCBQs0bNgwTZ48WeXKldPbb7+tbt26Ob12AAAAV2Az7CtkFxEpKSkKDAxUcnIy6+sAAAq9zMxMpaenW10GrpG7u7s8PDwuu4YO4xnXx+8QAAC4smsZy9D5CABAIXXy5Ent3btXRezvjIWGn5+fypYtKy8vL6tLAQAAAK4b4SMAAIVQZmam9u7dKz8/PwUHB7MrsgsxDENpaWk6dOiQdu7cqWrVqsnNjWW6AQAA4JoIHwEAKITS09NlGIaCg4Pl6+trdTm4Rr6+vvL09NTu3buVlpYmHx8fq0sCAAAArgt/RgcAoBCj49F10e0IAACAwoBRLQAAAAAAAACHIHwEAAAAAAAA4BCEjwAAoNCKiIjQxIkTLX8NAAAAoKhiwxkAAFBgtGzZUjfddFO+hX2rV6+Wv79/vrwWAAAAgGtH+AgAAFyKYRjKzMyUh8fVhzHBwcFOqAgAAADA5TDtGgCAIsAwpFOnrDkMI2819unTR8uWLdNbb70lm80mm82mXbt26eeff5bNZtOPP/6o6OhoeXt7a8WKFfr333/VuXNnhYaGqlixYrrlllu0ePHiHK958ZRpm82madOmqWvXrvLz81O1atU0f/78a/pZJiQkqHPnzipWrJgCAgLUo0cPHThwIPv7f/75p1q1aqXixYsrICBAUVFRWrNmjSRp9+7d6tSpk0qWLCl/f3/VqVNHCxYsuKb3BwAAAFwJnY8AABQBp09LxYpZ894nT0p5mfn81ltvadu2bYqMjNTYsWMlmZ2Lu3btkiT997//1WuvvabKlSurRIkS2rt3rzp06KBx48bJx8dHH374oTp16qStW7eqYsWKl32fMWPGaMKECXr11Vc1adIk3X///dq9e7dKlSp11RoNw1CXLl3k7++vZcuWKSMjQwMHDlTPnj31888/S5Luv/9+NWjQQFOnTpW7u7s2bNggT09PSdKgQYOUlpam5cuXy9/fX/Hx8Spm1S8GAAAAcALCRwAAUCAEBgbKy8tLfn5+KlOmTK7vjx07Vu3atct+HhQUpPr162c/HzdunObOnav58+dr8ODBl32fPn366N5775UkvfTSS5o0aZL++OMP3X777VetcfHixdq4caN27typsLAwSdJHH32kOnXqaPXq1brllluUkJCgJ598UjVr1pQkVatWLfv+hIQEdevWTXXr1pUkVa5c+arvCQAAALgywkcHyMyU5s83Hzt3ls41OwAAYBk/P7MD0ar3zg/R0dE5np86dUpjxozRd999p/379ysjI0NnzpxRQkLCFV+nXr162V/7+/urePHiOnjwYJ5q2LJli8LCwrKDR0mqXbu2SpQooS1btuiWW27R8OHD1b9/f3300Udq27atunfvripVqkiSHn/8cT366KNatGiR2rZtq27duuWoBwAAAChsWPPRATIypLvukrp3N6e5AQBgNZvNnPpsxWGz5c9nuHjX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635P4zLTxQ3DyF47sn///tqxY4d69eqlTZs2KTo6WpPObVwQGxur3bt3a+jQodq/f7/atGmjJ5544rrrAQBcQVbW+eBRko4ezdshSTfdJBUvbknZAFBUED46COEjAADXzsvLS5kXTRu4+eab9ddffykiIkJVq1bNcfifCzhtNpuaNWumMWPGaP369fLy8tLcuXMv+5pXU7t2bWVkZOj333/PPnfkyBFt27ZNtWrVyj4XFhamAQMG6Ouvv9aIESP0wQcfZH8vODhYffr00ccff6yJEyfq/fffv+afBwAgDy7u1O/XT9qyJW/HBf+dBwA4BtOuHYTwEQCAaxcREaHff/9du3btUrFixVSqVCkNGjRIH3zwge699149+eST2Ru4fP755/rggw+0Zs0a/fTTT4qJiVFISIh+//13HTp0KDskjIiI0I8//qitW7cqKChIgYGB8vT0vGId1apVU+fOnfXQQw/pvffeU/HixfX000+rfPny6ty5syRp6NChio2NVfXq1XXs2DEtWbIk+z2ff/55RUVFqU6dOkpNTdV3332XI7QEAOQj+9qNdvXqOW73agDANSN8dBDCRwAArt0TTzyhBx54QLVr19aZM2e0c+dORURE6JdfftFTTz2l9u3bKzU1VeHh4br99tvl5uamgIAALV++XBMnTlRKSorCw8P1+uuvKzY2VpL00EMP6eeff1Z0dLROnjyppUuXqmXLlletZebMmRoyZIjuuOMOpaWl6bbbbtOCBQuyg8vMzEwNGjRIe/fuVUBAgG6//Xa9+eabksxuy5EjR2rXrl3y9fVV8+bN9fnnnzvs5wYgH508Kf30k5SebnUlObm5SbfdJpUunb+vu2GD9M8/+fuazrZ2bc7nJUpYUgYA4NJsxuUWNSqkUlJSFBgYqOTkZAUEBDjsfe65R5ozR5o40Vz7GAAAZzp79qx27typSpUqyefitRzhEq70O3TWeAaOw++wAHvoIWnaNKuruLRWraQlS/Lv9XbvlipXNtdMLEwWLJDO/QEKAOAY1zKWofPRQeydj+x2DQAAALiQP/80HyMjpZIlra3F7uxZafVqaePG/H3dv/4yg8fixc2NV1yZj49Uvrz52L691dUAAC5A+OggTLsGAAAAXNCePebjrFlSVJSlpWQ7ftwMQo8ckU6flvz88ud17Z+1ZUtp/vz8eU0AAC5i+W7X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5GuBRco990j33adiZ22yfS0dOSIdPCiFhlpdGAAAQMHxwgsvWF1C4XD2rPlI+AgAABzousLHu+++W7feeqsSExNVv3797PNt2rRR165d8624IsfdXZLk6ytVqSL984/011+EjwAAAHAAOh8BAIATXFf4KEllypRRmTJltHfvXtlsNpUvX14NGzbMz9qKtMhIM3zcvFlq3drqagAAAAoONzc32a6wLg07YeeRPXz08bG2DgAAUKhdV/iYlZWlcePG6fXXX9fJkyclScWLF9eIESM0atQoubld1ybakKRXX5U++ED9Kw3WPD3OpjMAAAAXmTt3bo7n6enpWr9+vT788EONGTPGoqpcEJ2PAADACa4rfBw1apSmT5+ul19+Wc2aNZNhGPrll180evRonT17Vi+++GKeX2vKlCl69dVXlZiYqDp16mjixIlq3rz5Ve/75Zdf1KJFC0VGRmrDhg3X8zEKppMnpe3bVav8n5LY8RoAAOBinTt3znXu7rvvVp06dTRnzhz169fPgqpcEOEjAABwgutqUfzwww81bdo0Pfroo6pXr57q16+vgQMH6oMPPtCsWbPy/Dpz5szR0KFDNWrUKK1fv17NmzdXbGysEhISrnhfcnKyevfurTZt2lxP+QVb3bqSpDKHN0kyw0fDsLIgAAAA19CoUSMtXrzY6jJcB+EjAABwgusKH48ePaqaNWvmOl+zZk0dPXo0z6/zxhtvqF+/furfv79q1aqliRMnKiwsTFOnTr3ifY888ojuu+++7F22ryQ1NVUpKSk5jgItMlKS5LvjL3m6Z+nECWnPHotrAgAAKODOnDmjSZMmqUKFClaX4joIHwEAgBNcV/hYv359vfPOO7nOv/POO6pXr16eXiMtLU1r165VTExMjvMxMTFatWrVZe+bOXOm/v33X73wwgt5ep/x48crMDAw+wgLC8vTfZapWlXy9pbt9Gm1qbxTkrnjNQAAAEwlS5ZUqVKlso+SJUuqePHimjFjhl599VWry3MdhI8AAMAJrmvNxwkTJqhjx45avHixmjRpIpvNplWrVmnPnj1asGBBnl7j8OHDyszMVGhoaI7zoaGhSkpKuuQ927dv19NPP60VK1bIwyNvpY8cOVLDhw/Pfp6SklKwA0gPD6lWLWnDBrUO3ayF26to82YpNtbqwgAAAAqGN998M8du125ubgoODlajRo1UsmRJCytzMWlp5qOXl7V1AACAQu26wscWLVpo27Ztmjx5sv7++28ZhqG77rpLDz/8sEaPHp2nDWPsLhw4SpJhGLnOSVJmZqbuu+8+jRkzRtWrV8/z63t7e8vb1f6aW7eutGGDbvHeJKkzm84AAABcoE+fPlaX4PoMQ0pPN7/29LS2FgAAUKhdV/goSeXKlcu1q/Wff/6pDz/8UDNmzLjq/aVLl5a7u3uuLseDBw/m6oaUpBMnTmjNmjVav369Bg8eLEnKysqSYRjy8PDQokWL1Lp16+v9OAVLdLS0ebNKVikl/cSO1wAAABeaOXOmihUrpu7du+c4/8UXX+j06dN64IEHLKrMhWRlnf86jzOKAAAArsd1rfmYH7y8vBQVFaW4uLgc5+Pi4tS0adNc1wcEBGjTpk3asGFD9jFgwADVqFFDGzZsUKNGjZxVuuM9/ri0bp38nhgoSYqPlzIzLa4JAACggHj55ZdVunTpXOdDQkL00ksvWVCRC7J3PUp0PgIAAIey9M+cw4cPV69evRQdHa0mTZro/fffV0JCggYMGCDJXK9x3759mj17ttzc3BR5bidou5CQEPn4+OQ6X1hUriz5+UmnT0vbt0uX2GAcAACgyNm9e7cqVaqU63x4eLgSEhIsqMgFET4CAAAnsTR87Nmzp44cOaKxY8cqMTFRkZGRWrBggcLDwyVJiYmJRXoA6Z6ZplsiM7XsD19t2ED4CAAAIJl/gN64caMiIiJynP/zzz8VFBRkTVGuhvARAAA4yTWFj3fdddcVv3/8+PFrLmDgwIEaOHDgJb83a9asK947evRojR49+prf0yUMHChNm6b+TSZrmR7S+vXSPfdYXRQAAID17rnnHj3++OMqXry4brvtNknSsmXLNGTIEN3DgClvMjLOf+3ubl0dAACg0Lum8DEwMPCq3+/du/cNFYRzihWT0tPVwLZekrRhg7XlAAAAFBTjxo3T7t271aZNG3mc2ywlKytLvXv3Zs3HvLJ3Pnp4SDabtbUAAIBC7ZrCx5kzZzqqDlysQQNJUvgRM3xcv14yDMaGAAAAXl5emjNnjsaNG6cNGzbI19dXdevWzV66B3lgDx+Zcg0AABzM0jUfcQU33SRJ8t+xUR62TB065K6kJKlsWWvLAgAAKCiqVaumatWqWV2GayJ8BAAATuJmdQG4jOrVJT8/2U6fVkyl7ZKYeg0AACBJd999t15++eVc51999VV1797dgopckH3NRw96EQAAgGMRPhZU7u5SvXqSpNtDz0+9BgAAKOqWLVumjh075jp/++23a/ny5RZU5ILofAQAAE5C+FiQnVv3saHXBkl0PgIAAEjSyZMn5eXlleu8p6enUlJSLKjIBRE+AgAAJyF8LMhatZK6d5dvs5slET4CAABIUmRkpObMmZPr/Oeff67atWtbUJELInwEAABOwiIvBVn37lL37ipzUNJL0j//SCdOSMWLW10YAACAdZ577jl169ZN//77r1q3bi1J+umnn/Tpp5/qyy+/tLg6F8GajwAAwEnofHQBISFSuXKSYUibNlldDQAAgLXuvPNOzZs3T//8848GDhyoESNGaN++fVqyZIkiIiKsLs810PkIAACchPCxoDMM6d9/1apmoiQ2nQEAAJCkjh076pdfftGpU6f0zz//6K677tLQoUMVFRVldWmugfARAAA4CeFjQde/v1S1qvpkTJMkrVtncT0AAAAFxJIlS/Sf//xH5cqV0zvvvKMOHTpozZo1VpflGggfAQCAk7DIS0FXt64kqc4ZcyC9erWVxQAAAFhr7969mjVrlmbMmKFTp06pR48eSk9P11dffcVmM9eCNR8BAICT0PlY0DVsKEkK2fW7JEN//SWdPGltSQAAAFbo0KGDateurfj4eE2aNEn79+/XpEmTrC7LNdH5CAAAnITwsaBr0EByd5f7oQOKDt2rrCymXgMAgKJp0aJF6t+/v8aMGaOOHTvK3d3d6pJcF+EjAABwEsLHgs7XV6pXT5LUPfwPSdIff1hZEAAAgDVWrFihEydOKDo6Wo0aNdI777yjQ4cOWV2WayJ8BAAATkL46ArOTb2+zYfwEQAAFF1NmjTRBx98oMTERD3yyCP6/PPPVb58eWVlZSkuLk4nTpywukTXYQ8fWfMRAAA4GOGjKzgXPtZINlNHNp0BAABFmZ+fnx588EGtXLlSmzZt0ogRI/Tyyy8rJCREd955p9XluQb7hjN0PgIAAAcjfHQFLVpITz8tr2eekM0m7dolHTxodVEAAADWq1GjhiZMmKC9e/fqs88+s7oc18G0awAA4CSEj66gShVp/Hj59+iomjXNU3Q/AgAAnOfu7q4uXbpo/vz5VpfiGggfAQCAkxA+uphbbjEff//d2joAAADgwljzEQAA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0tKlS5v8TGFhoebOnev9K3ViYqKmTp2q4uJinT171ltvyJAhAZ8bMmQIf2UGAABAA/RJAYQzFpwBgIuIi4vTLbfcoltuuUVPPvmkpkyZoqeeekr3339/o/Xr6ur0zDPP6K677mr0XM3xeDytcckAAABoZ+iTAghXjHwEgEvUr18/nTlzRpIUHR2t2tragOODBg3S3r179fWvf71BiYjw/Wd369atAZ/bunWr+vbtG/wbAAAAQNijTwogXDDyEQCacOLECY0bN04PPPCABgwYoKSkJP3zn//U888/r9tvv12SXV3wvffe04033qjY2Fh16dJFTz75pMaOHauePXtq3LhxioiI0CeffKJdu3bp2Wef9Z7/jTfe0ODBgzV06FC99tpr2rZtm1555RW3bhcAAAAhiD4pgHDHgjMA0ITq6mo9/fTTeuedd/Tvf/9b58+f93bennjiCcXHx2vt2rWaOXOmDh48qO7du+vgwYOS7OqCc+fO1Y4dOxQdHa2+fftqypQpmjp1qiQ7leXFF1/U6tWrtWnTJqWnp2v+/Pm65557XLxjAAAAhBr6pADCHeEjALigsRUJAQAAgLZEnxRAW+CZjwAAAAAAAACCgvARAAAAAAAAQFAw7RoAAAAAAABAUDDyEQAAAAAAAEBQED4CAAAAAAAACArCRwAAAAAAAABBQfgIAAAAAAAAICgIHwEAAAAAAAAEBeEjAAAAAAAAgKAgfAQAAAAAAAAQFISPAAAAAAAAAILi/wHuOenpQATueAAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 1600x600 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 设置超参数\n",
    "num_epochs = 1000\n",
    "learning_rate = 0.1\n",
    "batch_size = 128\n",
    "eps = 1e-7\n",
    "torch.manual_seed(0)\n",
    "\n",
    "# 初始化MLP模型\n",
    "mlp = MLP_torch(layer_sizes=[2, 4, 1], use_bias=True, \n",
    "    out_activation='sigmoid')\n",
    "\n",
    "# 定义SGD优化器\n",
    "opt = torch.optim.SGD(mlp.parameters(), lr=learning_rate)\n",
    "\n",
    "# 训练过程\n",
    "losses = []\n",
    "test_losses = []\n",
    "test_accs = []\n",
    "for epoch in range(num_epochs):\n",
    "    st = 0\n",
    "    loss = []\n",
    "    while True:\n",
    "        ed = min(st + batch_size, len(x_train))\n",
    "        if st >= ed:\n",
    "            break\n",
    "        # 取出batch，转为张量\n",
    "        x = torch.tensor(x_train[st: ed], \n",
    "            dtype=torch.float32)\n",
    "        y = torch.tensor(y_train[st: ed], \n",
    "            dtype=torch.float32).reshape(-1, 1)\n",
    "        # 计算MLP的预测\n",
    "        # 调用模型时，PyTorch会自动调用模型的forward方法\n",
    "        # y_pred的维度为(batch_size, layer_sizes[-1])\n",
    "        y_pred = mlp(x)\n",
    "        # 计算交叉熵损失\n",
    "        train_loss = torch.mean(-y * torch.log(y_pred + eps) \\\n",
    "            - (1 - y) * torch.log(1 - y_pred + eps))\n",
    "        # 清空梯度\n",
    "        opt.zero_grad()\n",
    "        # 反向传播\n",
    "        train_loss.backward()\n",
    "        # 更新参数\n",
    "        opt.step()\n",
    "\n",
    "        # 记录累加损失，需要先将损失从张量转为numpy格式\n",
    "        loss.append(train_loss.detach().numpy())\n",
    "        st += batch_size\n",
    "\n",
    "    losses.append(np.mean(loss))\n",
    "    # 计算测试集上的交叉熵\n",
    "    # 在不需要梯度的部分，可以用torch.inference_mode()加速计算\n",
    "    with torch.inference_mode():\n",
    "        x = torch.tensor(x_test, dtype=torch.float32)\n",
    "        y = torch.tensor(y_test, dtype=torch.float32).reshape(-1, 1)\n",
    "        y_pred = mlp(x)\n",
    "        test_loss = torch.sum(-y * torch.log(y_pred + eps) \\\n",
    "            - (1 - y) * torch.log(1 - y_pred + eps)) / len(x_test)\n",
    "        test_acc = torch.sum(torch.round(y_pred) == y) / len(x_test)\n",
    "        test_losses.append(test_loss.detach().numpy())\n",
    "        test_accs.append(test_acc.detach().numpy())\n",
    "\n",
    "print('测试精度：', test_accs[-1])\n",
    "# 将损失变化进行可视化\n",
    "plt.figure(figsize=(16, 6))\n",
    "plt.subplot(121)\n",
    "plt.plot(losses, color='blue', label='train loss')\n",
    "plt.plot(test_losses, color='red', ls='--', label='test loss')\n",
    "plt.xlabel('Step')\n",
    "plt.ylabel('Loss')\n",
    "plt.title('Cross-Entropy Loss')\n",
    "plt.legend()\n",
    "\n",
    "plt.subplot(122)\n",
    "plt.plot(test_accs, color='red')\n",
    "plt.ylim(top=1.0)\n",
    "plt.xlabel('Step')\n",
    "plt.ylabel('Accuracy')\n",
    "plt.title('Test Accuracy')\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "deepnote": {},
  "deepnote_execution_queue": [],
  "deepnote_notebook_id": "3b94328ab2964431b83f6d3de7ee135e",
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
